解耦为何重要
人处理复杂性的能力有限 -> 通过解耦的手段来保证代码不至于复杂到无法控制的地步。
高内聚、低耦合
- 代码结构清晰
- 分层和模块化合理
- 依赖关系简单
- 模块或类之间耦合小
如何判定代码需要解耦
- 修改代码牵一发而动全身
- 类与类之间的关系过于复杂
如何给代码解耦
封装与抽象
封装与抽象可以有效的屏蔽实现的复杂性,隔离易变性,给依赖的模块提供稳定且易用的抽象接口。中间层
引入中间层进行过渡模块化
合理划分模块进行解耦代码,提高代码的可读性与可维护性,每个模块只提供封装了内部实现细节的接口给其他模块使用。
- 其他设计思想与原则
- 单一职责原则
高内聚的代码会使代码更加松耦合,而实现高内聚的指导原则就是单一职责原则。类设计功能单一,那么依赖的类就比较少,耦合也降低了。
- 基于接口而非实现编程
通过接口这样的中间层去隔离变化与具体的实现,这样的话互相依赖的类或者模块,一个类的改动不会影响另一个类或者模块。把一种强耦合(强依赖)的关系降成了松耦合(弱依赖)的关系
- 依赖注入
依赖注入将代码之间的强耦合变成弱耦合,耦合关系没那么紧密,做到容易替换插拔。
- 多用组合少用继承
继承是一种强耦合关系,父类与子类高度耦合,容易牵一发而动全身;组合是一种弱依赖的关系,更加的灵活。
- 迪米特法则
不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口,实现代码的松耦合。